const jwt = require("jsonwebtoken");
/**
 *
 * @param  instance 实例
 * @param  prefix 前缀
 * @param  specifiedType 制定类型
 * @param  filter 过滤器
 */
const findMembers = function (instance, {prefix, specifiedType, filter}) {
    // 递归函数
    function _find(instence) {
        // 基线条件（跳出递归)
        if (instence.__proto__ === null) return [];
        // 返回一个包含所有自身属性（不包含继承属性）的数组
        let names = Reflect.ownKeys(instance);
        names = names.filter((name) => {
            // 过滤掉不满足条件的属性或者方法名
            return _shouldKeep(name);
        });
        return [...names, ..._find(instance.__proto__)]
    }

    function _shouldKeep(value) {
        if (filter) {
            if (filter(value)) {
                return true;
            }
        }
        if (prefix) {
            // 判断前缀
            if (value.startsWith(prefix)) {
                return true;
            }
        }
        if (specifiedType) {
            // 判断是否在原型上
            if (instance[value] instanceof specifiedType) {
                return true;
            }
        }
    }

    return _find(instance);
};

/**
 * 办法令牌
 */
const generateToken = function (uid, scope) {
    const secretKey = global.config.security.secretKey;
    const expiresIn = global.config.security.expiresIn;
    return jwt.sign({
            uid,
            scope,
        },
        secretKey,
        {
            expiresIn,
        });
};

module.exports = {
    findMembers,
    generateToken,
};
